home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Disc to the Future 2
/
Disc to the Future Part II Programmer's Reference (Wayzata Technology)(6013)(1992).bin
/
MAC
/
MPW_TOOL
/
TOOLS
/
TOOLS_WI
/
ICON_8
/
ICONX_FO
/
RDEBUG.C
< prev
next >
Wrap
Text File
|
1990-03-02
|
6KB
|
275 lines
/*
* rdebug.c - breakpoint, variable, ttrace, xtrace.
*/
#include <math.h>
#include "::h:config.h"
#include "::h:rt.h"
#include "rproto.h"
#include "::h:opdefs.h"
#ifdef TraceBack
extern struct b_list list_tmp; /* argument of Op_Apply */
extern struct b_proc *opblks[];
extern word lastop; /* last op-code */
extern dptr xargp;
extern word xnargs; /* number of arguments */
extern dptr fnames;
#endif /* TraceBack */
#ifdef TraceBack
/*
* ttrace - show offending expression.
*/
novalue ttrace()
{
struct b_proc *bp;
word nargs;
fprintf(stderr, " ");
switch ((int)lastop) {
case Op_Invoke:
bp = (struct b_proc *)BlkLoc(*xargp);
nargs = xnargs;
if (xargp[0].dword == D_Proc)
putstr(stderr, &(bp->pname));
else
outimage(stderr, xargp, 0);
putc('(', stderr);
while (nargs--) {
outimage(stderr, ++xargp, 0);
if (nargs)
putc(',', stderr);
}
putc(')', stderr);
break;
case Op_Toby:
putc('{', stderr);
outimage(stderr, ++xargp, 0);
fprintf(stderr, " to ");
outimage(stderr, ++xargp, 0);
fprintf(stderr, " by ");
outimage(stderr, ++xargp, 0);
putc('}', stderr);
break;
case Op_Subsc:
putc('{', stderr);
outimage(stderr, ++xargp, 0);
putc('[', stderr);
outimage(stderr, ++xargp, 0);
putc(']', stderr);
putc('}', stderr);
break;
case Op_Sect:
putc('{', stderr);
outimage(stderr, ++xargp, 0);
putc('[', stderr);
outimage(stderr, ++xargp, 0);
putc(':', stderr);
outimage(stderr, ++xargp, 0);
putc(']', stderr);
putc('}', stderr);
break;
case Op_Bscan:
putc('{', stderr);
outimage(stderr, xargp, 0);
fputs(" ? ..}", stderr);
break;
case Op_Coact:
putc('{', stderr);
outimage(stderr, ++xargp, 0);
fprintf(stderr, " @ ");
outimage(stderr, ++xargp, 0);
putc('}', stderr);
break;
case Op_Apply:
outimage(stderr, xargp++, 0);
fprintf(stderr," ! ");
outimage(stderr, (dptr)&list_tmp, 0);
break;
case Op_Create:
fprintf(stderr,"{create ..}");
break;
case Op_Field:
putc('{', stderr);
outimage(stderr, ++xargp, 0);
fprintf(stderr, " . ");
fprintf(stderr, "%s", StrLoc(fnames[IntVal(*++xargp)]));
putc('}', stderr);
break;
case Op_Limit:
fprintf(stderr, "limit counter: ");
outimage(stderr, xargp, 0);
break;
case Op_Llist:
fprintf(stderr,"[ ... ]");
break;
default:
bp = opblks[lastop];
nargs = abs((int)bp->nparam);
putc('{', stderr);
if (lastop == Op_Bang || lastop == Op_Random)
goto oneop;
if (abs((int)bp->nparam) >= 2) {
outimage(stderr, ++xargp, 0);
putc(' ', stderr);
putstr(stderr, &(bp->pname));
putc(' ', stderr);
}
else
oneop:
putstr(stderr, &(bp->pname));
outimage(stderr, ++xargp, 0);
putc('}', stderr);
}
if (ipc.opnd != NULL)
fprintf(stderr, " from line %d in %s", findline(ipc.opnd),
findfile(ipc.opnd));
putc('\n', stderr);
fflush(stderr);
}
/*
* xtrace - procedure *bp is being called with nargs arguments, the first
* of which is at arg; produce a trace message.
*/
novalue xtrace(bp, nargs, arg, pline, pfile)
struct b_proc *bp;
word nargs;
dptr arg;
int pline;
char *pfile;
{
fprintf(stderr, " ");
if (bp == NULL)
fprintf(stderr, "????");
else {
if (arg[0].dword == D_Proc)
putstr(stderr, &(bp->pname));
else
outimage(stderr, arg, 0);
arg++;
putc('(', stderr);
while (nargs--) {
outimage(stderr, arg++, 0);
if (nargs)
putc(',', stderr);
}
putc(')', stderr);
}
if (pline != 0)
fprintf(stderr, " from line %d in %s", pline, pfile);
putc('\n', stderr);
fflush(stderr);
}
#endif /* TraceBack */
/*
* Service routine to display variables in given number of
* procedure calls to file f.
*/
novalue xdisp(fp,dp,count,f)
int count;
FILE *f;
struct pf_marker *fp;
register dptr dp;
{
register dptr np;
register int n;
struct b_proc *bp;
extern dptr globals, eglobals;
extern dptr gnames;
extern dptr statics;
while (count--) { /* go back through 'count' frames */
bp = (struct b_proc *)BlkLoc(*dp); /* get address of procedure block */
/*
* Print procedure name.
*/
putstr(f, &(bp->pname));
fprintf(f, " local identifiers:\n");
/*
* Print arguments.
*/
np = bp->lnames;
for (n = abs(bp->nparam); n > 0; n--) {
fprintf(f, " ");
putstr(f, np);
fprintf(f, " = ");
outimage(f, ++dp, 0);
putc('\n', f);
np++;
}
/*
* Print locals.
*/
dp = &fp->pf_locals[0];
for (n = (int)bp->ndynam; n > 0; n--) {
fprintf(f, " ");
putstr(f, np);
fprintf(f, " = ");
outimage(f, dp++, 0);
putc('\n', f);
np++;
}
/*
* Print statics.
*/
dp = &statics[bp->fstatic];
for (n = (int)bp->nstatic; n > 0; n--) {
fprintf(f, " ");
putstr(f, np);
fprintf(f, " = ");
outimage(f, dp++, 0);
putc('\n', f);
np++;
}
dp = fp->pf_argp;
fp = fp->pf_pfp;
}
/*
* Print globals.
*/
fprintf(f, "\nglobal identifiers:\n");
dp = globals;
np = gnames;
while (dp < eglobals) {
fprintf(f, " ");
putstr(f, np);
fprintf(f, " = ");
outimage(f, dp++, 0);
putc('\n', f);
np++;
}
fflush(f);
}